﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using Gestión_UTN.Entities;

namespace Gestión_UTN.daimpl
{
    class fechaExamendaimpl : da.fechaExamenda
    {
        public fechaExamendaimpl()
        {

        }

        public bool SaveFechaExamen(int tie_id, int mat_id, DateTime fe_fecha)
        {
            bool ingresada = false;

            OleDbConnection conex = null;
            OleDbTransaction trans = null;

            try
            {
                conex = util.Conexion.conectarAccess();
                trans = null;

                if (null != conex)
                {

                    string sql = "INSERT INTO fe_fechasExamenes(tie_id, mat_id, fe_fecha)" +
                                "VALUES(@tie_id, @mat_id, @fe_fecha)";

                    conex.Open();
                    trans = conex.BeginTransaction();

                    OleDbCommand insertar = new OleDbCommand(sql, conex, trans);

                    insertar.Parameters.AddWithValue("@tie_id", tie_id);
                    insertar.Parameters.AddWithValue("@mat_id", mat_id);
                    insertar.Parameters.AddWithValue("@fe_fecha", fe_fecha);

                    insertar.ExecuteNonQuery();

                    trans.Commit();

                    ingresada = true;

                    conex.Close();
                }

            }
            catch (Exception ex)
            {
                ingresada = false;
                trans.Rollback();
                conex.Close();

                throw new exceptions.daexception(ex.Message);
            }

            return ingresada;
        }

        public bool DeleteFechaExamen(DateTime fe_fecha, int mat_id)
        {
            bool eliminada = false;

            OleDbConnection conex = null;
            OleDbTransaction trans = null;

            try
            {
                conex = util.Conexion.conectarAccess();
                trans = null;

                if (null != conex)
                {

                    string sql = "DELETE FROM fe_fechasExamenes " +
                        "WHERE mat_id = @mat_id AND fe_fecha = @fe_fecha";

                    conex.Open();

                    trans = conex.BeginTransaction();

                    OleDbCommand eliminar = new OleDbCommand(sql, conex, trans);

                    eliminar.Parameters.AddWithValue("@mat_id", mat_id);
                    eliminar.Parameters.AddWithValue("@fe_fecha", fe_fecha);

                    eliminar.ExecuteNonQuery();

                    trans.Commit();

                    eliminada = true;

                    conex.Close();
                }

            }
            catch (Exception ex)
            {
                eliminada = false;
                trans.Rollback();
                conex.Close();

                throw new exceptions.daexception(ex.Message);
            }

            return eliminada;
        }

        public bool ModifyFechaExamen(DateTime fe_fecha_anterior, int mat_id_anterior, int tie_id, int mat_id, DateTime fe_fecha)
        {
            bool modificada = false;

            OleDbConnection conex = null;
            OleDbTransaction trans = null;

            try
            {
                conex = util.Conexion.conectarAccess();
                trans = null;

                if (null != conex)
                {

                    string sql = "UPDATE fe_fechasExamenes SET tie_id = @tie_id, mat_id = @mat_id, fe_fecha = @fe_fecha " +
                                    "WHERE mat_id = @mat_id_anterior AND fe_fecha = @fe_fecha_anterior";

                    conex.Open();
                    trans = conex.BeginTransaction();

                    OleDbCommand modificar = new OleDbCommand(sql, conex, trans);

                    modificar.Parameters.AddWithValue("@tie_id", tie_id);
                    modificar.Parameters.AddWithValue("@mat_id", mat_id);
                    modificar.Parameters.AddWithValue("@fe_fecha", fe_fecha);
                    modificar.Parameters.AddWithValue("@mat_id_anterior", mat_id_anterior);
                    modificar.Parameters.AddWithValue("@fe_fecha_anterior", fe_fecha_anterior);

                    modificar.ExecuteNonQuery();

                    trans.Commit();

                    modificada = true;

                    conex.Close();
                }

            }
            catch (Exception ex)
            {
                modificada = false;
                trans.Rollback();
                conex.Close();

                throw new exceptions.daexception(ex.Message);
            }

            return modificada;
        }

        public System.Data.DataTable FindAllFechas()
        {
            DataTable tablaFechas = null;

            OleDbConnection conex = null;

            try
            {
                conex = util.Conexion.conectarAccess();
                tablaFechas = new DataTable();

                if (null != conex)
                {

                    string sql = "SELECT fe_id, tie_tipo, mat_nombre, car_nombre, fe_fecha" +
                                    " FROM fe_fechasExamenes fe, tie_tipoExamen tie, " +
                                    " mat_materias mat, car_carreras car " +
                                    "WHERE fe.tie_id = tie.tie_id AND fe.mat_id = mat.mat_id" +
                                    " AND mat.car_id = car.car_id";

                    OleDbDataAdapter adaptador = new OleDbDataAdapter(sql, conex);

                    conex.Open();

                    adaptador.Fill(tablaFechas);

                    conex.Close();
                }

            }
            catch (Exception ex)
            {
                tablaFechas = null;
                conex.Close();

                throw new exceptions.daexception(ex.Message);
            }

            return tablaFechas;
        }

        public List<Entities.FechaExamen> FindExamenesbyFecha(DateTime fe_fecha)
        {
            List<FechaExamen> fechas = null;

            OleDbConnection conex = null;

            try
            {
                conex = util.Conexion.conectarAccess();

                if (null != conex)
                {
                    fechas = new List<FechaExamen>();

                    string sql = "SELECT fe_id, tie_id, mat_id, fe_fecha" +
                                    " FROM fe_fechasExamenes fe " +
                                    "WHERE fe_fecha = @fecha";

                    OleDbCommand consulta = new OleDbCommand(sql, conex);

                    conex.Open();

                    consulta.Parameters.AddWithValue("@fecha", fe_fecha);

                    OleDbDataReader lector = consulta.ExecuteReader();

                    while (lector.Read())
                    {
                        FechaExamen fec = new FechaExamen();

                        fec.Fe_id = Convert.ToInt32(lector[0].ToString());
                        fec.Tie_id = Convert.ToInt32(lector[1].ToString());
                        fec.Mat_id = Convert.ToInt32(lector[2].ToString());
                        fec.Fe_fecha = Convert.ToDateTime(lector[3].ToString());

                        fechas.Add(fec);

                        fec = null;

                    }

                    conex.Close();
                }

            }
            catch (Exception ex)
            {
                fechas = null;
                conex.Close();

                throw new exceptions.daexception(ex.Message);
            }

            return fechas;
        }

        public List<Entities.FechaExamen> FindExamenesbyMateria(int mat_id)
        {
            List<FechaExamen> fechas = null;

            OleDbConnection conex = null;

            try
            {
                conex = util.Conexion.conectarAccess();

                if (null != conex)
                {
                    fechas = new List<FechaExamen>();

                    string sql = "SELECT fe_id, tie_id, mat_id, fe_fecha" +
                                    " FROM fe_fechasExamenes fe " +
                                    "WHERE mat_id = @mat_id";

                    OleDbCommand consulta = new OleDbCommand(sql, conex);

                    conex.Open();

                    consulta.Parameters.AddWithValue("@mat_id", mat_id);

                    OleDbDataReader lector = consulta.ExecuteReader();

                    while (lector.Read())
                    {
                        FechaExamen fec = new FechaExamen();

                        fec.Fe_id = Convert.ToInt32(lector[0].ToString());
                        fec.Tie_id = Convert.ToInt32(lector[1].ToString());
                        fec.Mat_id = Convert.ToInt32(lector[2].ToString());
                        fec.Fe_fecha = Convert.ToDateTime(lector[3].ToString());

                        fechas.Add(fec);

                        fec = null;

                    }

                    conex.Close();
                }

            }
            catch (Exception ex)
            {
                fechas = null;
                conex.Close();

                throw new exceptions.daexception(ex.Message);
            }

            return fechas;
        }


        public FechaExamen FindExamenbyId(int fe_id)
        {
            FechaExamen fecha = null;

            OleDbConnection conex = null;

            try
            {
                conex = util.Conexion.conectarAccess();

                if (null != conex)
                {
                    fecha = new FechaExamen();

                    string sql = "SELECT fe_id, tie_id, mat_id, fe_fecha" +
                                    " FROM fe_fechasExamenes fe " +
                                    "WHERE fe_id = @fe_id";

                    OleDbCommand consulta = new OleDbCommand(sql, conex);

                    conex.Open();

                    consulta.Parameters.AddWithValue("@fe_id", fe_id);

                    OleDbDataReader lector = consulta.ExecuteReader();

                    while (lector.Read())
                    {
                        fecha.Fe_id = Convert.ToInt32(lector[0].ToString());
                        fecha.Tie_id = Convert.ToInt32(lector[1].ToString());
                        fecha.Mat_id = Convert.ToInt32(lector[2].ToString());
                        fecha.Fe_fecha = Convert.ToDateTime(lector[3].ToString());
                    }

                    conex.Close();
                }

            }
            catch (Exception ex)
            {
                fecha = null;
                conex.Close();

                throw new exceptions.daexception(ex.Message);
            }

            return fecha;
        }
    }
}
